#ifndef ISCCN_PDT_API_H
#define ISCCN_PDT_API_H
#ifndef IN
#define IN
#endif
#ifndef OUT
#define OUT
#endif
enum
{
    PDT_CMD_KILL  = 1,
    PDT_CMD_KILL_ACK,
    PDT_CMD_UPDATE_KEY, //上电时，或者定时发送查询当前是否
    PDT_QUERY_STATUS_KILL, //上电时，或者定时发送查询当前是否
    PDT_QUERY_KEY_WRITE, //下发密钥命令后，查询模块密钥是否写成功
    PDT_CMD_MESSAGE_SEND,//Android侧需要发送一个短信
    PDT_CMD_MESSAGE_RECVD,//对讲侧收到一个短信
    PDT_CMD_ACK_RECVD
};
#ifdef __cplusplus
extern "C"
{
#endif
/***********************************************************************
获取遥毕状态
1--本终端被杀 , 0 正常
***********************************************************************/
int isccn_pdt_get_killstatus();
/***********************************************************************
isccn_pdt_init:初始化
devName---保TF卡在系统中路径。
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_init(IN const char *devName);
/***********************************************************************
isccn_pdt_exit:退出
devName---保TF卡在系统中路径。
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_exit();
/***********************************************************************
isccn_pdt_write_groupkey:保存扫描后的组信息
devName---保存设备名,TF卡在系统中路径。
input---数据
ilen---数据长度(1024Bytes)
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_write_groupkey(IN unsigned char* input,IN int ilen);
/***********************************************************************
isccn_pdt_write_killkey:保存扫描后的销毁信息(每个设备不一样)
devName---保存设备名,TF卡在系统中路径。
input---数据
ilen---数据长度(8Bytes)
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_write_killkey(IN unsigned char* input,IN int ilen);
/***********************************************************************
isccn_pdt_write_groupKey_killkey:保存扫描后的信息,包含组码和销毁码
devName---保存设备名,TF卡在系统中路径。
data---数据
groupKeylen---组码长度
killKeylen---销毁码长度
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_write_groupKey_killkey(IN unsigned char* data,IN int groupKeylen,IN int killKeylen);
/***********************************************************************
isccn_pdt_get_keyindex:获取发送数据时使用的ki,IV值[IV(48)+KI(8)+CCSUM(16)=72]
ki---索引号,8bit
value---IV值,48bit
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_get_keyindex(IN unsigned int groupid,IN int tmsi,IN int imsi,OUT unsigned char* ki,OUT unsigned char *iv);
/***********************************************************************
isccn_pdt_set_keyindex:设置处理接收到对讲音频数据时使用的ki,IV值
ki---索引号,8bit
value---IV值,48bit
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_set_keyindex(IN unsigned char ki,IN unsigned char *iv,IN unsigned int ugi,IN int ismi,IN int tmsi);
/***********************************************************************
isccn_pdt_encode_audiodata:处理原始对讲音频数据
value---原始对讲音频数据,处理完成后也放在此
iLen---数据长度(129Bit,17Bytes)
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_encode_audiodata(IN unsigned char *value,IN int iLen,unsigned short frmid);
/***********************************************************************
isccn_pdt_decode_audiodata:处理收到的对讲音频数据
value---收到的对讲音频数据,处理完成后也放在此
iLen---数据长度(129Bit,17Bytes)
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_decode_audiodata(IN OUT unsigned char *value,IN int iLen,unsigned short frmid);

int isccn_pdt_parse_uartcmd(IN unsigned char *in_value,IN int iLen,OUT int* localSend,OUT unsigned char *out_value,IN OUT int* ioLen);
//对讲侧收到短信后调用此
//对讲侧收到短信后调用此 out_value长度最少48字节
int isccn_pdt_parse_supercommand(IN unsigned char *value,IN int *iLen,OUT int* commandID,OUT int* groupId,
                                 OUT int* terminalId,OUT int* localSend,OUT unsigned char *out_value,IN OUT int* ioLen);
/***********************************************************************
isccn_pdt_system_command:处理来自外系统的命令(为将来保留功能)
inValue---原始命令信息
iLen---命令长度
outValue---返回信息
oLen---返回信息长度
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_system_command(IN unsigned char *inValue,IN int iLen,OUT unsigned char *outValue,OUT int* oLen);


//以下接口供Android侧调用
//获取组密钥,缓冲为1024字节,iLen=1024
int isccn_android_pdt_get_groupkey(OUT unsigned char *gk,IN int iLen);
//获取设备码,缓冲为8字节,iLen=8
int isccn_android_pdt_get_killkey(OUT unsigned char *kk,IN int iLen);
//在通过NFC发送给从机器之前调用此进行消息组合,主机必须先对本机设置了组号，终端编号，终端总数,firstTid为起始编号,
//gk为isccn_android_pdt_get_groupkey
//kk为isccn_android_pdt_get_killkey
//value为andriod侧分配一段内存，数据放到此4096足够
//iLen为分配内存中存放的数据数量
int isccn_android_pdt_get_superkey2NFC(IN int groupId,IN int terminalId,IN int firstTid,IN int totalTerminalSize,IN unsigned char *gk,IN unsigned char *kk,OUT unsigned char *value,IN int* iLen);
//从机在获取NFC数据后进行解析,然后将out_value通过UART发送给对讲模块
//in_value为NFC中读取的数据
//iLen为数据长度
//groupId设置从机的组号，AT指令
//terminalId设置从机的终端号，AT指令
//totalTerminalSize从机的总数
//firstTid第一个机器的终端号
//out_value为需要转发给对讲模块数据,分配不小于2048字节
//iLen为需要发给对讲模块数据长度
int isccn_android_pdt_parse_superkeyFromNFC(IN unsigned char *in_value,IN int iLen,OUT int* groupId,OUT int* terminalId,OUT int* totalTerminalSize,OUT int* firstTid,OUT unsigned char *out_value,IN OUT int* ioLen);
//Android 生成命令,out_value为封装后通过UART发送信息，ioLen为长度
int isccn_android_pdt_send_uartcmd(IN int cmd,OUT unsigned char *out_value,IN OUT int* ioLen);
//Android 生成短信接口,out_value为封装后通过UART发送信息，ioLen为长度
int isccn_android_pdt_send_messagecmd(IN int cmd,IN int grpid,IN int tid,IN unsigned char* kk,OUT unsigned char *out_value,IN OUT int* ioLen);
//Android 侧分析URAT返回
typedef struct
{
  int cmd;
  int result;
  int len;
  unsigned char val[64];
}uartcmd_t;
int isccn_android_pdt_parse_uartcmd(IN unsigned char *in_value,IN int iLen,OUT uartcmd_t *result);

#ifdef __cplusplus
}
#endif

#endif	/* ISCCN_PDT_API_H */

